#include <vector>
#include <iostream>


/*
其实在计算左边的累计乘和右边累计乘两者并不冲突（一个是顺序一个是倒序）
所以可以用双指针直接解决，answer[i]相当于同时存放了前缀和后缀的信息（因为后面两者也要相乘，所以就可以直相乘了）
*/
// std::vector<int> productExceptSelf2(std::vector<int>& nums) {
//     std::vector<int> answer(nums.size(), 1);
//     int left = 0, right = nums.size() - 1;
//     int lp = 1, rp = 1;
//     while (right >= 0 && left < nums.size()) {
//         answer[right] *= rp;
//         answer[left] *= lp;
//         lp *= nums[left++];
//         rp *= nums[right--];
//     }
//     return answer;
// }
using namespace std;
//  不能使用int 作为迭代（某些情况下），因为int类型的数从0开始，当i=0时，i-1会变成一个很大的数
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> answer(nums.size(), 1);
        int left = 0, right = nums.size() - 1;
        int lp = 1, rp = 1;
        while (right >= 0 && left < nums.size()) {
            answer[right] *= rp;
            answer[left] *= lp;
            lp *= nums[left++];
            rp *= nums[right--];
        }
        return answer;
    }
};

int main(int argc, char* argv[]){

    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    Solution solver;
    vector<int> b = solver.productExceptSelf(a);

    for (int i : b){
        cout<<b[i]<<endl;
    }
    return 0;
}